Embedded Binaries 和 Linked Frameworks and Libraries的区别

2017-5-18

Link

连接一个库

如果连接的是一个静态库

比如libFoo.a,linker会把这个静态库复制到你最终输出的二进制文件里面去,你不需要在运行时解决任何依赖关系的问题。

如果连接的是一个动态库

比如.dylib或者系统的framework(framework跟动态库很像,只不过还包含一些资源文件)。

运行程序时,会认为这个库是默认就在系统里或者你工程的某个位置的,用到的库会在运行时加载进来。

这样做的好处是,比如加载的是系统的framework,那么大家的程序在打包生成二进制时都不需要包含这个framework,因为这个framework是系统提供的。

同样,自己程序包含的动态库,当你的程序有一些相关的扩展程序时,也可以直接使用动态库,而不需要把动态库包含到扩展程序的bundle里面。

Embed

Embed是把这个库嵌入到最终输出的程序的bundle里面。

如果连接的是第三方的动态库(比如从github上下载的,或者自己生成的),你就需要对这个库进行embed,然后在进行link。

这样,在运行时,就会寻找你的程序的bundle,找到这个库并加载进来。

区别

Link 后,写代码时,可以导入库的头文件、资源啥的,但是如果没有 Embed,在 App 实际运行时,会找不到这些文件和资源,因为库没有包含到App 的 bundle 里面来。

那还区分 Link 和 Embed 干啥,直接全部用 Embed 不就完了吗?

有的时候我们是只需要 Link 而不需要 Embed 的,比如一个 Framework 依赖另外一个 Framework 的时候(Apple 并不提倡这种操作),比如 Framework A 依赖 Framework B,主工程依赖 Framework A,这时在 Framework A 中,只要 Link Framework B,不需要也不能( Xcode 对于 Framework 工程没有对应的操作界面) Embed Framework B,主工程中在同时 Embed Framework A 和 Framework B。

具体可以看 Embedding Frameworks In An App 的 Apps with Dependencies Between Frameworks 片段

参考

When should we use “embedded binaries” rather than “Linked Frameworks” in Xcode?

Embedding Frameworks In An App